dojo.require("dojo.io.script")
dojo.require("dojox.rpc.Service");

// model that works with Yahoo Search API
dojo.declare("dojox.grid.data.yahooSearch", dojox.grid.data.Dynamic, {
constructor: function(inFields, inData, inSearchNode){
this.rowsPerPage = 20;
this.searchNode = inSearchNode;
this.fieldNames = dojo.map(inFields, "return item.name;");
this.yahoo = new dojox.rpc.Service(
dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd")
);
},
// server send / receive
send: function(inAsync, inParams, inOnReceive, inOnError){
var d = this.yahoo.imageSearch(
dojo.mixin({ 
results: this.rowsPerPage,
query: this.getQuery()
}, inParams)
);
d.addCallbacks(
dojo.hitch(this, "receive", inOnReceive, inOnError), 
dojo.hitch(this, "error", inOnError)
);
this.onSend(inParams);
return d;
},
receive: function(inOnReceive, inOnError, inData){
try{
inData = inData.ResultSet;
inOnReceive(inData);
this.onReceive(inData);
}catch(e){
if(inOnError){
inOnError(inData);
}
}
},
error: function(inOnError, inErr) {
var m = 'io error: ' + inErr.message;
alert(m);
if (inOnError)
inOnError(m);
},
encodeParam: function(inName, inValue) {
return dojo.string.substitute('&${0}=${1}', [inName, inValue]);
},
getQuery: function(){
return dojo.byId(this.searchNode).value.replace(/ /g, '+');
},
fetchRowCount: function(inCallback){
this.send(true, inCallback);
},
// request data 
requestRows: function(inRowIndex, inCount){
inRowIndex = (inRowIndex == undefined ? 0 : inRowIndex);
var params = { 
start: inRowIndex + 1
}
this.send(true, params, dojo.hitch(this, this.processRows));
},
// server callbacks
processRows: function(inData){
for(var i=0, l=inData.totalResultsReturned, s=inData.firstResultPosition; i<l; i++){
this.setRow(inData.Result[i], s - 1 + i);
}
// yahoo says 1000 is max results to return
var c = Math.min(1000, inData.totalResultsAvailable);
if(this.count != c){
this.setRowCount(c);
this.allChange();
this.onInitializeData(inData);
}
},
getDatum: function(inRowIndex, inColIndex){
var row = this.getRow(inRowIndex);
var field = this.fields.get(inColIndex);
return (inColIndex == undefined ? row : (row ? row[field.name] : field.na));
},
// events
onInitializeData: function(){ },
onSend: function(){ },
onReceive: function(){ }
});

// report
modelChange = function(){
var n = dojo.byId('rowCount');
if(n){
n.innerHTML = dojo.string.substitute('about ${0} row(s)', [model.count]);
}
}


// some data formatters
getCellData = function(inCell, inRowIndex, inField){
var m = inCell.grid.model;
return m.getDatum(inRowIndex, inField);
}

formatLink = function(inData, inRowIndex){
if(!inData){ return '&nbsp;'; }
var text = getCellData(this, inRowIndex, this.extraField);
return dojo.string.substitute(
'<a target="_blank" href="${href}">${text}</a>', 
{ href: inData, text: text }
);
};

formatImage = function(inData, inRowIndex){
if(!inData){ return '&nbsp;'; }
var info = getCellData(this, inRowIndex, this.extraField);
var o = {
href: inData, 
src: info.Url,
width: info.Width,
height: info.Height
}
return dojo.string.substitute(
'<a href="${href}" target="_blank"><img border=0 src="${src}" width="${width}" height="${height}"></a>', o);
};

formatDate = function(inDatum, inRowIndex){
if(!inDatum){ return '&nbsp;'; }
var d = new Date(inDatum * 1000);
return dojo.string.substitute(
"${0}/${1}/${2}",
[ d.getMonth()+1, d.getDate(), d.getFullYear() ]
);
};

formatDimensions = function(inData, inRowIndex){
if(!inData){ return '&nbsp;'; }
var w = inData, h = getCellData(this, inRowIndex, this.extraField);
return w + ' x ' + h;
}
